package com.king.designpatterns.行为模式.模板方法模式;

/**
 * 模板方法模式（Template Method Pattern）是一种简单的、常见的且应用非常广泛的模式。
 *
 * 定义：定义一个操作中的算法的框架，而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
 *
 * 角色：
 *      ■ 抽象模板（Abstract Template）角色：
 *          该角色定义一个或多个抽象操作，以便让子类实现；这些抽象操作是基本操作，是一个顶级逻辑的组成步骤。还需要定义并实现一个或几个模板方法，
 *          这些模板方法一般是具体方法，即一个框架，实现对基本方法的调度，完成固定的逻辑。
 *      ■ 具体模板（Concrete Template）角色：
 *          该角色实现抽象模板中定义的一个或多个抽象方法，每一个抽象模板角色都可以有任意多个具体模板角色与之对应，
 *          而每一个具体模板角色都可以给出这些抽象方法的不同实现，从而使得顶级逻辑的实现各不相同。
 *
 * 优点：
 *      ■ 封装不变的部分，扩展可变部分。不变的部分封装到父类中实现，而可变的部分则可以通过继承进行扩展。
 *      ■ 提取公共部分代码，便于维护。将公共部分的代码抽取出来放在父类中，维护时只需要修改父类中的代码。
 *      ■ 行为由父类控制，子类实现。模板方法模式中的基本方法是由子类实现的，因此子类可以通过扩展增加相应的功能，符合开闭原则。
 *
 * 场景：
 *      ■ 多个子类有公共方法，并且逻辑基本相同时。
 *      ■ 可以把重要的、复杂的、核心算法设计为模板方法，周边的相关细节功能则由各个子类实现。
 *      ■ 重构时，模板方法模式是一个经常使用的模式，将相同的代码抽取到父类中。
 *
 * @author king
 * @date 2021-06-08 14:43
 */
public class TemplateMethodPattern {
    public static void main(String[] args) {
        Account account = new DemandAccount();
        System.out.println("活期利息：" + account.calculateInterest());
        account = new FixedAccount();
        System.out.println("定期利息：" + account.calculateInterest());
    }
}
